package org.example.study2;

/**
 * 演示守护线程（后台线程）的特性
 * 核心知识点：当所有前台线程结束时，JVM会强制终止守护线程
 */
public class Demo_204 {
    public static void main(String[] args) {
        // 创建一个新线程，使用Lambda表达式定义线程执行体
        Thread thread = new Thread(() -> {
            while (true) {
                System.out.println("hello thread..");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        /**
         * 关键设置：将线程标记为后台线程
         * 若注释此设置，线程默认是用户线程（前台线程）
         * 必须在线程启动前调用，否则抛出IllegalThreadStateException
         **/
        thread.setDaemon(true);
        // 启动线程，JVM开始调度执行线程的run()方法
        thread.start();
        // 检查线程是否处于活动状态，是否已启动且未终止（启动后立即检查）
        System.out.println("线程是否存活：" + thread.isAlive());
        // 主线程继续执行，打印结束提示
        System.out.println("main 方法执行完成");
        /**
         * 主线程执行完毕（前台线程结束）
         * 若thread是唯一后台线程，JVM将直接退出
         * 此时后台线程会被强制终止，无论是否在执行任务
         */
    }
}

/*
输出：
        hello thread..
        线程是否存活：true
        main 方法执行完成*/

/*

* 如果注释thread.setDaemon(true);创建线程时默认是前台线程。输出
hello thread..
线程是否存活：true
main 方法执行完成
hello thread..
hello thread..
hello thread..
hello thread..
hello thread..
hello thread..
hello thread..
hello thread..
hello thread..
hello thread..
hello thread..
hello thread..
......
* */


/*总结：
        设置成后台线程之后，main方法执行完成之后 ，整个程序就退出了，子线程也就自动结束了
        如果是前台线程，子线程不会受main方法的影响 ，会一直运行下去

        创建线程时默认是前台线程
        前台线程可以阻止进程的退出
        后台线程不阻止进程的退出*/

